{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "ed4cc996",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_ollama import OllamaEmbeddings\n",
    "embedding_vector = OllamaEmbeddings(\n",
    "    base_url=\"http://host.docker.internal:11434\", # 仅仅因为我的环境在docker里，ollama装在windows系统里。\n",
    "    # base_url=\"http://localhost:11434\",\n",
    "    model=\"bge-m3:latest\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "97a45cb9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1.定义数据库\n",
    "db_url = \"./asset/vector/lancedb_example.db\"\n",
    "from langchain_community.vectorstores import LanceDB\n",
    "table_name='langchain_test'\n",
    "vector_store = LanceDB(\n",
    "    uri=db_url,\n",
    "    embedding=embedding_vector,\n",
    "    table_name=table_name\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "51a68370",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 2.定义文档\n",
    "from langchain_core.documents import Document\n",
    "\n",
    "raw_documents = [\n",
    "    # 水果类\n",
    "    Document(\n",
    "        page_content=\"芒果是漆树科芒果属热带水果，原产于印度半岛。果实多为肾形或椭圆形，果皮颜色从青绿色到深黄色不等，果肉细腻香甜，富含 β- 胡萝卜素和膳食纤维。除直接生食外，还可制作果汁、果酱、芒果糯米饭等美食。\",\n",
    "        metadata={\"source\": \"水果\", \"type\": \"热带植物\"},\n",
    "    ),\n",
    "    # 蔬菜类\n",
    "    Document(\n",
    "        page_content=\"西兰花是十字花科芸薹属蔬菜，起源于地中海东部。其食用部分为绿色的花球，由无数细小的花蕾聚合而成，口感脆嫩清香，富含维生素 C、叶酸和萝卜硫素。常见做法有清炒、焯水凉拌、搭配肉类烤制。\",\n",
    "        metadata={\"source\": \"蔬菜\", \"type\": \"花菜类植物\"},\n",
    "    ),\n",
    "    # 动物类（海洋哺乳动物）\n",
    "    Document(\n",
    "        page_content=\"海豚是齿鲸亚目海豚科哺乳动物，广泛分布于全球各大洋。它们具有极高的智商和复杂的社交行为，通过回声定位导航和捕猎，主要以鱼类、乌贼为食。海豚常被视为友好的象征，也是海洋公园中的热门动物。\",\n",
    "        metadata={\"source\": \"动物\", \"type\": \"海洋哺乳动物\"},\n",
    "    ),\n",
    "    # 动物类（啮齿类）\n",
    "    Document(\n",
    "        page_content=\"仓鼠是啮齿目仓鼠科小型哺乳动物，原产于亚洲和欧洲部分地区。体型圆润，尾巴短小，毛色有金棕、银白、三线等多种，性格温顺胆小，以谷物、种子、蔬菜为食。因饲养简便、外形可爱，成为广受欢迎的宠物。\",\n",
    "        metadata={\"source\": \"动物\", \"type\": \"啮齿类哺乳动物\"},\n",
    "    ),\n",
    "    # 生物类（灵长目）\n",
    "    Document(\n",
    "        page_content=\"黑猩猩是灵长目人科黑猩猩属动物，与人类亲缘关系最近，基因相似度高达 98% 以上。它们栖息在非洲热带雨林，过着群居生活，会使用工具获取食物（如用树枝钓白蚁），具有情感表达能力和学习行为。\",\n",
    "        metadata={\"source\": \"生物\", \"type\": \"非人灵长类\"},\n",
    "    ),\n",
    "    # 天文类\n",
    "    Document(\n",
    "        page_content=\"月球是地球唯一的天然卫星，直径约 3476 公里，距离地球约 38 万公里。它本身不发光，通过反射太阳光呈现不同月相，对地球的潮汐现象有显著影响。月球表面布满环形山、月海和月陆，是人类唯一登陆过的地外天体。\",\n",
    "        metadata={\"source\": \"天文\", \"type\": \"卫星\"},\n",
    "    ),\n",
    "    # 历史类\n",
    "    Document(\n",
    "        page_content=\"故宫博物院位于北京中轴线中心，是明清两代皇家宫殿，旧称紫禁城。始建于明永乐十八年，占地约 72 万平方米，拥有宫殿楼宇 9000 余间，珍藏文物 186 万余件。其建筑布局严谨对称，是中国古代宫殿建筑的巅峰之作，现为世界文化遗产。\",\n",
    "        metadata={\"source\": \"历史\", \"type\": \"皇家建筑\"},\n",
    "    ),\n",
    "    # 物理类\n",
    "    Document(\n",
    "        page_content=\"相对论是爱因斯坦提出的物理学理论，分为狭义相对论（1905 年）和广义相对论（1915 年）。狭义相对论提出光速不变原理和相对性原理，颠覆了经典力学的绝对时空观；广义相对论则将引力解释为时空弯曲的效应，成功预言了黑洞、引力透镜等现象。\",\n",
    "        metadata={\"source\": \"物理\", \"type\": \"基础科学\"},\n",
    "    ),\n",
    "    # 文学类\n",
    "    Document(\n",
    "        page_content=\"《三国演义》是中国古典文学四大名著之一，作者罗贯中。小说以东汉末年到西晋统一的历史为背景，讲述了魏、蜀、吴三国争霸的故事，塑造了诸葛亮、曹操、关羽等众多经典人物，兼具历史真实性与艺术感染力。\",\n",
    "        metadata={\"source\": \"文学\", \"type\": \"历史演义小说\"},\n",
    "    ),\n",
    "    # 医学类\n",
    "    Document(\n",
    "        page_content=\"流感病毒是正粘病毒科的 RNA 病毒，分为甲、乙、丙、丁四型，其中甲型流感病毒易发生变异。它主要通过飞沫和接触传播，症状包括高热、头痛、肌肉酸痛、呼吸道不适，易引发并发症。每年接种流感疫苗是最有效的预防手段。\",\n",
    "        metadata={\"source\": \"医学\", \"type\": \"呼吸道病毒\"},\n",
    "    ),\n",
    "    # 饮品类\n",
    "    Document(\n",
    "        page_content=\"普洱茶是中国云南特有的发酵茶，属于黑茶类。以云南大叶种晒青毛茶为原料，经渥堆发酵等工艺制成，茶汤色泽红浓透亮，滋味醇厚回甘，富含茶多酚和茶多糖。根据储存方式不同，可分为生普和熟普，具有越陈越香的特点。\",\n",
    "        metadata={\"source\": \"饮品\", \"type\": \"发酵茶\"},\n",
    "    ),\n",
    "    # 计算机类\n",
    "    Document(\n",
    "        page_content=\"Python 是一种解释型、面向对象的编程语言，由吉多・范罗苏姆于 1991 年发布。它语法简洁优雅，可读性强，拥有丰富的第三方库，广泛应用于数据分析、人工智能、Web 开发、自动化测试等领域，是编程入门的热门选择。\",\n",
    "        metadata={\"source\": \"计算机\", \"type\": \"编程语言\"},\n",
    "    ),\n",
    "    # 水生生物类（食用鱼类）\n",
    "    Document(\n",
    "        page_content=\"三文鱼是冷水性溯河洄游鱼类，背部呈青灰色，肉质橙红富含Omega-3，繁殖期会从海洋洄游至淡水河流产卵。\",\n",
    "        metadata={\"source\": \"水生生物\", \"type\": \"食用鱼类\"},\n",
    "    ),\n",
    "    # 水生生物类（无脊椎动物）\n",
    "    Document(\n",
    "        page_content=\"水母是海洋中的无脊椎动物，身体呈透明伞状，边缘有触手，部分种类能发光，通过喷水推进移动。\",\n",
    "        metadata={\"source\": \"水生生物\", \"type\": \"无脊椎动物\"},\n",
    "    ),\n",
    "    # 乐器\n",
    "    Document(\n",
    "        page_content=\"小提琴是一种弦乐器，有四根弦，通过弓摩擦弦发声，音色悠扬，是交响乐团的核心乐器之一。\",\n",
    "        metadata={\"source\": \"乐器\", \"type\": \"弦乐器\"},\n",
    "    ),\n",
    "    Document(\n",
    "        page_content=\"架子鼓是打击乐器的组合，包括军鼓、踩镲、嗵鼓等部件，常用于流行、摇滚等音乐类型的伴奏。\",\n",
    "        metadata={\"source\": \"乐器\", \"type\": \"打击乐器\"},\n",
    "    ),\n",
    "    # 交通工具\n",
    "    Document(\n",
    "        page_content=\"高铁是时速超过250公里的铁路列车，采用动车组技术，具有准时、舒适的特点，广泛用于城市间长途运输。\",\n",
    "        metadata={\"source\": \"交通工具\", \"type\": \"轨道交通\"},\n",
    "    ),\n",
    "    Document(\n",
    "        page_content=\"帆船依靠风力推动前进，船体轻盈，有单桅、双桅等类型，既是体育运动器材，也可用于休闲航行。\",\n",
    "        metadata={\"source\": \"交通工具\", \"type\": \"水上运输工具\"},\n",
    "    ),\n",
    "    # 航天器\n",
    "    Document(\n",
    "        page_content=\"空间站是在近地轨道运行的载人航天器，可长期驻留宇航员，用于开展空间科学实验和技术试验。\",\n",
    "        metadata={\"source\": \"航天器\", \"type\": \"载人航天器\"},\n",
    "    ),\n",
    "    Document(\n",
    "        page_content=\"卫星是环绕行星运行的人造天体，可用于通信、气象观测、导航等，按轨道分为地球同步卫星和极地卫星等。\",\n",
    "        metadata={\"source\": \"航天器\", \"type\": \"无人航天器\"},\n",
    "    ),\n",
    "    # 调料\n",
    "    Document(\n",
    "        page_content=\"肉桂是樟科植物的树皮，晒干后呈红棕色卷状，气味芳香，常用于烘焙、炖煮等料理的调味。\",\n",
    "        metadata={\"source\": \"调料\", \"type\": \"香辛料\"},\n",
    "    ),\n",
    "    Document(\n",
    "        page_content=\"酱油是大豆发酵制成的液体调味品，颜色深褐，咸鲜适口，是东亚烹饪中常用的基础调料。\",\n",
    "        metadata={\"source\": \"调料\", \"type\": \"发酵调味品\"},\n",
    "    ),\n",
    "    # 疾病\n",
    "    Document(\n",
    "        page_content=\"流感是由流感病毒引起的急性呼吸道传染病，症状包括发热、咳嗽、乏力，可通过飞沫传播。\",\n",
    "        metadata={\"source\": \"疾病\", \"type\": \"病毒性疾病\"},\n",
    "    ),\n",
    "    Document(\n",
    "        page_content=\"糖尿病是一种代谢性疾病，因胰岛素分泌不足或作用缺陷导致血糖升高，长期可能损害心脏、肾脏等器官。\",\n",
    "        metadata={\"source\": \"疾病\", \"type\": \"代谢性疾病\"},\n",
    "    ),\n",
    "    # 动物类\n",
    "    Document(\n",
    "        page_content=\"斑马是非洲草原特有的马科动物，黑白相间的条纹是其显著特征，这些条纹可能用于群体识别或迷惑捕食者。它们通常以草本植物为食，群居生活。\",\n",
    "        metadata={\"source\": \"野生动物\", \"type\": \"哺乳动物\"},\n",
    "    ),\n",
    "    Document(\n",
    "        page_content=\"鹦鹉是热带地区常见的鸟类，羽毛色彩艳丽，部分种类能模仿人类语言。它们主要以坚果、果实和种子为食，脚趾对生，适合抓握树枝。\",\n",
    "        metadata={\"source\": \"鸟类\", \"type\": \"宠物/野生动物\"},\n",
    "    ),\n",
    "    # 植物类\n",
    "    Document(\n",
    "        page_content=\"玫瑰是蔷薇科灌木，花瓣层层叠叠，花色丰富，常用于观赏和制作香水。其枝干有刺，喜阳光充足的环境，花期通常在春季至秋季。\",\n",
    "        metadata={\"source\": \"花卉\", \"type\": \"观赏植物\"},\n",
    "    ),\n",
    "    Document(\n",
    "        page_content=\"小麦是温带地区广泛种植的谷物，秸秆中空，穗状花序顶生，籽粒富含淀粉，是制作面粉的主要原料，可加工成面包、面条等食品。\",\n",
    "        metadata={\"source\": \"农作物\", \"type\": \"粮食植物\"},\n",
    "    ),\n",
    "    # 物品类\n",
    "    Document(\n",
    "        page_content=\"紫砂壶是中国特有的手工陶土茶具，以江苏宜兴产的最为著名，透气性好，适合冲泡乌龙茶，长期使用后壶身会形成包浆。\",\n",
    "        metadata={\"source\": \"工艺品\", \"type\": \"茶具\"},\n",
    "    ),\n",
    "    Document(\n",
    "        page_content=\"冲锋衣是户外爱好者常用的功能性服装，采用防水透气面料，接缝处有压胶处理，能抵御风雨，适合登山、徒步等场景。\",\n",
    "        metadata={\"source\": \"服饰\", \"type\": \"户外装备\"},\n",
    "    ),\n",
    "    # 自然现象类\n",
    "    Document(\n",
    "        page_content=\"极光多见于南北极地区的高纬度夜空，是太阳带电粒子与地球大气层中的气体碰撞产生的发光现象，颜色以绿色最为常见。\",\n",
    "        metadata={\"source\": \"自然现象\", \"type\": \"天文现象\"},\n",
    "    ),\n",
    "    Document(\n",
    "        page_content=\"海啸是由海底地震、火山爆发或陨石撞击引发的巨型海浪，传播速度极快，到达岸边时会形成破坏性巨浪，对沿海地区造成严重影响。\",\n",
    "        metadata={\"source\": \"自然现象\", \"type\": \"地质灾害\"},\n",
    "    ),\n",
    "]\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "735fb409",
   "metadata": {},
   "source": [
    "# 增加文档"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "c6e44993",
   "metadata": {},
   "outputs": [],
   "source": [
    "vector_store = LanceDB.from_documents(raw_documents, embedding_vector)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c8c73e2e",
   "metadata": {},
   "source": [
    "# 查询文档"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e54b202f",
   "metadata": {},
   "source": [
    "## similarity_search"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "ce19583f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1. 内容：鹦鹉是热带地区常见的鸟类，羽毛色彩艳丽，部分种类能模仿人类语言。它们主要以坚果、果实和种子为食，脚趾...\n",
      "   元数据：{'source': '鸟类', 'type': '宠物/野生动物'}\n",
      "2. 内容：海豚是齿鲸亚目海豚科哺乳动物，广泛分布于全球各大洋。它们具有极高的智商和复杂的社交行为，通过回声定位...\n",
      "   元数据：{'source': '动物', 'type': '海洋哺乳动物'}\n",
      "3. 内容：仓鼠是啮齿目仓鼠科小型哺乳动物，原产于亚洲和欧洲部分地区。体型圆润，尾巴短小，毛色有金棕、银白、三线...\n",
      "   元数据：{'source': '动物', 'type': '啮齿类哺乳动物'}\n",
      "4. 内容：黑猩猩是灵长目人科黑猩猩属动物，与人类亲缘关系最近，基因相似度高达 98% 以上。它们栖息在非洲热带...\n",
      "   元数据：{'source': '生物', 'type': '非人灵长类'}\n",
      "5. 内容：斑马是非洲草原特有的马科动物，黑白相间的条纹是其显著特征，这些条纹可能用于群体识别或迷惑捕食者。它们...\n",
      "   元数据：{'source': '野生动物', 'type': '哺乳动物'}\n"
     ]
    }
   ],
   "source": [
    "query = \"哺乳动物或植物\"\n",
    "results = vector_store.similarity_search(\n",
    "    query=query,  # 搜索query\n",
    "    k=5,  # 返回Top5最相似结果\n",
    ")\n",
    "for i, doc in enumerate(results, 1):\n",
    "    print(f\"{i}. 内容：{doc.page_content[:50]}...\")\n",
    "    print(f\"   元数据：{doc.metadata}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aeb36efb",
   "metadata": {},
   "source": [
    "## similarity_search_with_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "3b5ea70f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1. 内容：鹦鹉是热带地区常见的鸟类，羽毛色彩艳丽，部分种类能模仿人类语言。它们主要以坚果、果实和种子为食，脚趾...\n",
      "   元数据：{'source': '鸟类', 'type': '宠物/野生动物'}\n",
      "   分数：0.8929588198661804\n",
      "2. 内容：海豚是齿鲸亚目海豚科哺乳动物，广泛分布于全球各大洋。它们具有极高的智商和复杂的社交行为，通过回声定位...\n",
      "   元数据：{'source': '动物', 'type': '海洋哺乳动物'}\n",
      "   分数：0.8961169123649597\n",
      "3. 内容：仓鼠是啮齿目仓鼠科小型哺乳动物，原产于亚洲和欧洲部分地区。体型圆润，尾巴短小，毛色有金棕、银白、三线...\n",
      "   元数据：{'source': '动物', 'type': '啮齿类哺乳动物'}\n",
      "   分数：0.9076512455940247\n",
      "4. 内容：黑猩猩是灵长目人科黑猩猩属动物，与人类亲缘关系最近，基因相似度高达 98% 以上。它们栖息在非洲热带...\n",
      "   元数据：{'source': '生物', 'type': '非人灵长类'}\n",
      "   分数：0.9386287927627563\n",
      "5. 内容：斑马是非洲草原特有的马科动物，黑白相间的条纹是其显著特征，这些条纹可能用于群体识别或迷惑捕食者。它们...\n",
      "   元数据：{'source': '野生动物', 'type': '哺乳动物'}\n",
      "   分数：0.9753762483596802\n"
     ]
    }
   ],
   "source": [
    "query = \"哺乳动物或植物\"\n",
    "results = vector_store.similarity_search_with_score(\n",
    "    query=query,  # 搜索query\n",
    "    k=5,  # 返回Top5最相似结果\n",
    ")\n",
    "for i, (doc, score) in enumerate(results, 1):\n",
    "    print(f\"{i}. 内容：{doc.page_content[:50]}...\")\n",
    "    print(f\"   元数据：{doc.metadata}\")\n",
    "    print(f\"   分数：{score}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "57bf03d5",
   "metadata": {},
   "source": [
    "## similarity_search_by_vector"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "f7e25464",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "page_content='鹦鹉是热带地区常见的鸟类，羽毛色彩艳丽，部分种类能模仿人类语言。它们主要以坚果、果实和种子为食，脚趾对生，适合抓握树枝。' metadata={'source': '鸟类', 'type': '宠物/野生动物'}\n",
      "1. 内容：鹦鹉是热带地区常见的鸟类，羽毛色彩艳丽，部分种类能模仿人类语言。它们主要以坚果、果实和种子为食，脚趾...\n",
      "   元数据：{'source': '鸟类', 'type': '宠物/野生动物'}\n",
      "page_content='海豚是齿鲸亚目海豚科哺乳动物，广泛分布于全球各大洋。它们具有极高的智商和复杂的社交行为，通过回声定位导航和捕猎，主要以鱼类、乌贼为食。海豚常被视为友好的象征，也是海洋公园中的热门动物。' metadata={'source': '动物', 'type': '海洋哺乳动物'}\n",
      "2. 内容：海豚是齿鲸亚目海豚科哺乳动物，广泛分布于全球各大洋。它们具有极高的智商和复杂的社交行为，通过回声定位...\n",
      "   元数据：{'source': '动物', 'type': '海洋哺乳动物'}\n",
      "page_content='仓鼠是啮齿目仓鼠科小型哺乳动物，原产于亚洲和欧洲部分地区。体型圆润，尾巴短小，毛色有金棕、银白、三线等多种，性格温顺胆小，以谷物、种子、蔬菜为食。因饲养简便、外形可爱，成为广受欢迎的宠物。' metadata={'source': '动物', 'type': '啮齿类哺乳动物'}\n",
      "3. 内容：仓鼠是啮齿目仓鼠科小型哺乳动物，原产于亚洲和欧洲部分地区。体型圆润，尾巴短小，毛色有金棕、银白、三线...\n",
      "   元数据：{'source': '动物', 'type': '啮齿类哺乳动物'}\n",
      "page_content='黑猩猩是灵长目人科黑猩猩属动物，与人类亲缘关系最近，基因相似度高达 98% 以上。它们栖息在非洲热带雨林，过着群居生活，会使用工具获取食物（如用树枝钓白蚁），具有情感表达能力和学习行为。' metadata={'source': '生物', 'type': '非人灵长类'}\n",
      "4. 内容：黑猩猩是灵长目人科黑猩猩属动物，与人类亲缘关系最近，基因相似度高达 98% 以上。它们栖息在非洲热带...\n",
      "   元数据：{'source': '生物', 'type': '非人灵长类'}\n",
      "page_content='斑马是非洲草原特有的马科动物，黑白相间的条纹是其显著特征，这些条纹可能用于群体识别或迷惑捕食者。它们通常以草本植物为食，群居生活。' metadata={'source': '野生动物', 'type': '哺乳动物'}\n",
      "5. 内容：斑马是非洲草原特有的马科动物，黑白相间的条纹是其显著特征，这些条纹可能用于群体识别或迷惑捕食者。它们...\n",
      "   元数据：{'source': '野生动物', 'type': '哺乳动物'}\n"
     ]
    }
   ],
   "source": [
    "query = \"哺乳动物或植物\"\n",
    "query_vector = embedding_vector.embed_query(query)\n",
    "results = vector_store.similarity_search_by_vector(\n",
    "    embedding=query_vector,  # 搜索query\n",
    "    k=5,  # 返回Top5最相似结果\n",
    ")\n",
    "for i, doc in enumerate(results, 1):\n",
    "    print(doc)\n",
    "    print(f\"{i}. 内容：{doc.page_content[:50]}...\")\n",
    "    print(f\"   元数据：{doc.metadata}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "271bd163",
   "metadata": {},
   "source": [
    "## similarity_search_by_vector_with_relevance_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "2d8b4721",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Document(metadata={'source': '鸟类', 'type': '宠物/野生动物'}, page_content='鹦鹉是热带地区常见的鸟类，羽毛色彩艳丽，部分种类能模仿人类语言。它们主要以坚果、果实和种子为食，脚趾对生，适合抓握树枝。'), 0.3685827631522871)\n",
      "1. 内容：鹦鹉是热带地区常见的鸟类，羽毛色彩艳丽，部分种类能模仿人类语言。它们主要以坚果、果实和种子为食，脚趾...\n",
      "   元数据：{'source': '鸟类', 'type': '宠物/野生动物'}\n",
      "   分数：0.3685827631522871\n",
      "2. 内容：海豚是齿鲸亚目海豚科哺乳动物，广泛分布于全球各大洋。它们具有极高的智商和复杂的社交行为，通过回声定位...\n",
      "   元数据：{'source': '动物', 'type': '海洋哺乳动物'}\n",
      "   分数：0.36634965453078594\n",
      "3. 内容：仓鼠是啮齿目仓鼠科小型哺乳动物，原产于亚洲和欧洲部分地区。体型圆润，尾巴短小，毛色有金棕、银白、三线...\n",
      "   元数据：{'source': '动物', 'type': '啮齿类哺乳动物'}\n",
      "   分数：0.35819364928804875\n",
      "4. 内容：黑猩猩是灵长目人科黑猩猩属动物，与人类亲缘关系最近，基因相似度高达 98% 以上。它们栖息在非洲热带...\n",
      "   元数据：{'source': '生物', 'type': '非人灵长类'}\n",
      "   分数：0.3362892156205124\n",
      "5. 内容：斑马是非洲草原特有的马科动物，黑白相间的条纹是其显著特征，这些条纹可能用于群体识别或迷惑捕食者。它们...\n",
      "   元数据：{'source': '野生动物', 'type': '哺乳动物'}\n",
      "   分数：0.31030484057657604\n"
     ]
    }
   ],
   "source": [
    "# 向量检索+返回得分\n",
    "query = \"哺乳动物或植物\"\n",
    "query_vector = embedding_vector.embed_query(query) # 生成向量\n",
    "results = vector_store.similarity_search_by_vector_with_relevance_scores(\n",
    "    embedding=query_vector,\n",
    "    k=5,  # 返回Top5最相似结果\n",
    ")\n",
    "print(results[0])\n",
    "for i, (doc, score) in enumerate(results, 1):\n",
    "    print(f\"{i}. 内容：{doc.page_content[:50]}...\")\n",
    "    print(f\"   元数据：{doc.metadata}\")\n",
    "    print(f\"   分数：{score}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "e4503559",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1. 得分：0.3686  内容：鹦鹉是热带地区常见的鸟类，羽毛色彩艳丽，部分种类能模仿人类语言。它们主要以坚果、果实和种子为食，脚趾...\n",
      "2. 得分：0.3663  内容：海豚是齿鲸亚目海豚科哺乳动物，广泛分布于全球各大洋。它们具有极高的智商和复杂的社交行为，通过回声定位...\n"
     ]
    }
   ],
   "source": [
    "# 二次筛选：只保留得分 > 0.36 的高相关文档\n",
    "high_relevance_docs = [\n",
    "    (doc, score) for (doc, score) in results\n",
    "    if score > 0.36\n",
    "]\n",
    "\n",
    "# 按得分降序排序（确保最相关的在前面）\n",
    "high_relevance_docs.sort(key=lambda x: x[1], reverse=True)\n",
    "\n",
    "# 输出筛选后结果\n",
    "for i, (doc, score) in enumerate(high_relevance_docs, 1):\n",
    "    print(f\"{i}. 得分：{score:.4f}  内容：{doc.page_content[:50]}...\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43322254",
   "metadata": {},
   "source": [
    "## max_marginal_relevance_search"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "e1d8b6ff",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MMR搜索结果（兼顾相关性和多样性）：\n",
      "  1内容：鹦鹉是热带地区常见的鸟类，羽毛色彩艳丽，部分种类能模仿人类语言。它们主要以坚果、果实和种子为食，脚趾对生，适合抓握树枝。...\n",
      "   元数据：{'source': '鸟类', 'type': '宠物/野生动物'}\n",
      "  2内容：水母是海洋中的无脊椎动物，身体呈透明伞状，边缘有触手，部分种类能发光，通过喷水推进移动。...\n",
      "   元数据：{'source': '水生生物', 'type': '无脊椎动物'}\n",
      "  3内容：糖尿病是一种代谢性疾病，因胰岛素分泌不足或作用缺陷导致血糖升高，长期可能损害心脏、肾脏等器官。...\n",
      "   元数据：{'source': '疾病', 'type': '代谢性疾病'}\n"
     ]
    }
   ],
   "source": [
    "query = \"哺乳动物或植物\"\n",
    "# MMR搜索：从20条候选中选3条，平衡相关性和多样性\n",
    "results = vector_store.max_marginal_relevance_search(\n",
    "    query=query,\n",
    "    k=3,  # 最终返回3条\n",
    "    fetch_k=20,  # 先获取20条高相关候选\n",
    "    lambda_mult=0.5,  # 相关性和多样性各占50%\n",
    ")\n",
    "\n",
    "# 打印结果（观察是否包含不同类型的动物）\n",
    "print(\"MMR搜索结果（兼顾相关性和多样性）：\")\n",
    "for i, doc in enumerate(results, 1):\n",
    "    print(f\"  {i}内容：{doc.page_content[:60]}...\")\n",
    "    print(f\"   元数据：{doc.metadata}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d4aa8aeb",
   "metadata": {},
   "source": [
    "## max_marginal_relevance_search_by_vector"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "328d1564",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MMR搜索结果（兼顾相关性和多样性）：\n",
      "  1内容：鹦鹉是热带地区常见的鸟类，羽毛色彩艳丽，部分种类能模仿人类语言。它们主要以坚果、果实和种子为食，脚趾对生，适合抓握树枝。...\n",
      "   元数据：{'source': '鸟类', 'type': '宠物/野生动物'}\n",
      "  2内容：水母是海洋中的无脊椎动物，身体呈透明伞状，边缘有触手，部分种类能发光，通过喷水推进移动。...\n",
      "   元数据：{'source': '水生生物', 'type': '无脊椎动物'}\n",
      "  3内容：糖尿病是一种代谢性疾病，因胰岛素分泌不足或作用缺陷导致血糖升高，长期可能损害心脏、肾脏等器官。...\n",
      "   元数据：{'source': '疾病', 'type': '代谢性疾病'}\n"
     ]
    }
   ],
   "source": [
    "query = \"哺乳动物或植物\"\n",
    "query_vector = embedding_vector.embed_query(query)\n",
    "# MMR搜索：从20条候选中选3条，平衡相关性和多样性\n",
    "results = vector_store.max_marginal_relevance_search_by_vector(\n",
    "    embedding=query_vector,\n",
    "    k=3,  # 最终返回3条\n",
    "    fetch_k=20,  # 先获取20条高相关候选\n",
    "    lambda_mult=0.5,  # 相关性和多样性各占50%\n",
    ")\n",
    "\n",
    "# 打印结果（观察是否包含不同类型的动物）\n",
    "print(\"MMR搜索结果（兼顾相关性和多样性）：\")\n",
    "for i, doc in enumerate(results, 1):\n",
    "    print(f\"  {i}内容：{doc.page_content[:60]}...\")\n",
    "    print(f\"   元数据：{doc.metadata}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3e9828a",
   "metadata": {},
   "source": [
    "## get_table"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "41d29612",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LanceTable(name='vectorstore', version=6, _conn=LanceDBConnection(uri='/tmp/lancedb'))"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "table = vector_store.get_table()\n",
    "table"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "785f7f12",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "动物表文档总数： 32\n"
     ]
    }
   ],
   "source": [
    "print(\"动物表文档总数：\", table.count_rows()) "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1eedc280",
   "metadata": {},
   "source": [
    "## 删除"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "e7bf0121",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "已清空表中所有文档\n"
     ]
    }
   ],
   "source": [
    "# 清空表中所有数据（谨慎使用！）\n",
    "vector_store.delete(\n",
    "    delete_all=True\n",
    ")\n",
    "print(\"已清空表中所有文档\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "langchain-course (3.10.12)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
